added dir traversal for dynamic extensions
authorØyvind Kolås <ok@src.gnome.org>
Mon, 29 Aug 2005 11:23:10 +0000 (11:23 +0000)
committerØyvind Kolås <ok@src.gnome.org>
Mon, 29 Aug 2005 11:23:10 +0000 (11:23 +0000)
ChangeLog
babl/babl-conversion.h
babl/babl-db.h
babl/babl-extension.c
babl/babl-extension.h
babl/babl-instance.h
babl/babl-introspect.c

index cbc40c4932f03bde53ea1be3ea5dec2493119ef2..8296a55fe084ac76c88db65e0011eb88ac647bf1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2005-08-29  Øyvind Kolås  <pippin@gimp.org>
+
+       * babl/babl-db.h: Do nor warn about collision during db_insert
+       * babl/babl-extension.[ch]: Implemented fs traversal based on BABL_PATH.
+       added babl_set_extender to API.
+       * babl/babl-instance.h: Changed signature of type_name##_new.
+       * babl/babl-introspect.c: (babl_introspect): use new babl_extender
+
 2005-08-29  Øyvind Kolås  <pippin@gimp.org>
 
        * babl/babl-internal.c: (babl_internal_init): set memory functions.
index 50f06c63fb4ba449ab404b7fe1310dff6f18d930..e33a44b179187c040a1786057cae33e8efd907e2 100644 (file)
@@ -26,7 +26,7 @@
 void   babl_conversion_process (BablConversion *conversion,
                                 void           *source,
                                 void           *destination,
-                                long           n);
+                                long            n);
 
 Babl * babl_conversion_new     (Babl           *source,
                                 Babl           *destination,
index 1b1c9377c889d0c55a8027f8553c48eed71e6859..14c0d34e600b63bf70da54d3ad21397f1a63d835 100644 (file)
@@ -117,14 +117,16 @@ db_insert (Babl *babl)
 
   if (collision)
     {
+#if 0
       if (!strcmp (collision->instance.name, babl->instance.name)    )
         babl_log ("conflicting name:\n\t\tnew: '%s'\n\t\texisting '%s' from %s",
                 babl->instance.name, collision->instance.name,
-                BABL(collision->instance.creator)->instance.name);
+                collision->instance.creator?BABL(collision->instance.creator)->instance.name:"core");
       else if (collision->instance.id == babl->instance.id)
         babl_log ("conflicting id:\n\t\tnew: '%s' (id=%i)\n\t\texisting '%s' from %s",
                 babl->instance.name, babl->instance.id, collision->instance.name,
-                BABL(collision->instance.creator)->instance.name);
+                collision->instance.creator?BABL(collision->instance.creator)->instance.name:"core");
+#endif
       return collision;
     }
 
index 667817f7cd482d945d828b1c15c051d7efeb94f1..6c9573a9825610b8c23b79b2b1fa16e0d613fe13 100644 (file)
  * Boston, MA 02111-1307, USA.
  */
 
+#define BABL_PATH           "/usr/lib/babl:/usr/local/lib/babl:~/.babl";
+#define BABL_PATH_SEPERATOR "/"
+#define BABL_LIST_SEPERATOR ':'
+
+
 #define BABL_DYNAMIC_EXTENSIONS
 
 #define BABL_INIT_HOOK     init_hook();
@@ -37,7 +42,7 @@
 
 static int   each_babl_extension_destroy (Babl *babl, void *data);
 
-Babl *babl_extension_current_extender = NULL;
+static Babl *babl_extension_current_extender = NULL;
 
 Babl *
 babl_extender (void)
@@ -47,7 +52,7 @@ babl_extender (void)
   return NULL;
 }
 
-static void
+void
 babl_set_extender (Babl *new_extender)
 {
   babl_extension_current_extender = new_extender;
@@ -135,7 +140,6 @@ destroy_hook (void)
 #define RTLD_NOW 0
 #endif
 
-
 static Babl *
 load_failed (Babl *babl)
 {
@@ -157,7 +161,6 @@ babl_extension_load (const char *path)
   int  (*init)    (void) = NULL;
   void (*destroy) (void) = NULL;
  
-
   dl_handle = dlopen (path, RTLD_NOW);
   if (!dl_handle)
     {
@@ -183,7 +186,6 @@ babl_extension_load (const char *path)
       return load_failed (babl);
     }
 
-
   if (db_insert (babl) == babl)
     {
       babl_set_extender (NULL);
@@ -195,11 +197,128 @@ babl_extension_load (const char *path)
     }
 }
 
+static void
+babl_extension_load_dir (const char *base_path)
+{
+  DIR            *dir;
+
+  if ((dir = opendir (base_path)))
+   {
+     struct  dirent *dentry;
+
+     while ((dentry = readdir (dir)) != NULL)
+       {
+         if (dentry->d_name[0] != '.' &&
+             dentry->d_ino > 0)
+           {
+             char   *path = NULL;
+             struct  stat st;
+             char   *extension;
+
+             path = babl_strcat (path, base_path);
+             path = babl_strcat (path, BABL_PATH_SEPERATOR);
+             path = babl_strcat (path, dentry->d_name);
+
+             stat (path, &st);
+
+             if ((extension = strrchr (dentry->d_name, '.')) !=NULL &&
+                 !strcmp (extension, ".so"))
+               {
+                  babl_extension_load (path);
+               }
+
+             babl_free (path);
+           }
+
+       }
+   }
+}
+
+static const char *
+babl_dir_list (void)
+{
+  const char *ret;
+  
+  ret = getenv ("BABL_PATH");
+  if (!ret)
+    ret = BABL_PATH;
+  return ret;
+}
+
+
+static char *
+expand_path (char *path)
+{
+  char *src;
+  char *dst;
+
+  dst = NULL;
+
+  src=path;
+
+  while(*src)
+    {
+      switch (*src)
+        {
+          case '~':
+            dst = babl_strcat (dst, getenv ("HOME"));
+            break;
+          default:
+            {
+              char tmp[2]="?";
+              tmp[0]=*src;
+              dst = babl_strcat (dst, tmp);
+            }
+        }
+      src++;
+    }
+  return dst;
+}
+
+
+/*  parse the provided colon seperated list of paths to search
+ */
+static void
+babl_extension_load_dir_list (const char *dir_list)
+{
+  int eos = 0;
+  const char *src;
+  char       *path, *dst;
+
+
+  path = babl_strdup (dir_list);
+  src = dir_list;
+  dst = path;
+
+  while (!eos)
+    {
+      switch (*src)
+        {
+        case '\0':
+          eos=1;
+        case BABL_LIST_SEPERATOR:
+            {
+              char *expanded_path = expand_path (path);
+              babl_extension_load_dir (expanded_path);
+              babl_free (expanded_path);
+            }
+          dst=path;
+          src++;
+          *dst = '\0';
+          break;
+        default:
+          *(dst++) = *(src++);
+          *dst = '\0';
+          break;
+        }
+    }
+  babl_free (path);
+}
+
 static void
 dynamic_init_hook (void)
 {
-  babl_extension_load ("/home/pippin/.babl/naive-CMYK.so");
-  babl_extension_load ("/home/pippin/.babl/CIE-Lab.so");
+  babl_extension_load_dir_list (babl_dir_list ());
 }
 
 #endif
@@ -219,5 +338,4 @@ each_babl_extension_destroy (Babl *babl,
   return 0;  /* continue iterating */
 }
 
-
 BABL_CLASS_TEMPLATE (babl_extension)
index b344ea2f8ed5fd3ee2661811076f0d9877184034..3de0c58ae93c9c4b1bcf4c17aefd81fc2427889f 100644 (file)
 #include "babl-instance.h"
 
 Babl       * babl_extension_base      (void);
+
 Babl       * babl_extender            (void);
+void         babl_set_extender        (Babl *new_extender);
+
 Babl       * babl_extension_quiet_log (void);
 
 BABL_DEFINE_CLASS (babl_extension)
index 809b22673904919d7788db2e8036b70e363f6671..c5bf2ade293fd31b0b02199acc718aea5d64ea40 100644 (file)
@@ -18,7 +18,7 @@ void   type_name##_each    (BablEachFunction  each_fun,   \
                             void             *user_data); \
 Babl * type_name           (const char       *name);      \
 Babl * type_name##_id      (int               id);        \
-Babl * type_name##_new     (const char       *name,       \
+Babl * type_name##_new     (void             *first_arg,  \
                             ...);
 
 
index fb3ed80dadf44d76a25846fecc83aed326b5becc..09995a8261d2516dc2a2a03cb8a81cde02921bc3 100644 (file)
@@ -33,14 +33,13 @@ static int  each_introspect         (Babl *babl,
                                      void *user_data);
 #endif
 
-extern Babl *babl_extension_current_extender;
 void
 babl_introspect (Babl *babl)
 {
 #ifdef BABL_LOG
-  Babl *extender_backup = babl_extension_current_extender;
+  Babl *extender_backup = babl_extender ();
   
-  babl_extension_current_extender = babl_extension_quiet_log();
+  babl_set_extender (babl_extension_quiet_log());
 
   if (babl)
     {
@@ -76,7 +75,7 @@ babl_introspect (Babl *babl)
   babl_fish_each         (each_introspect, NULL);
   babl_log ("");
 
-  babl_extension_current_extender = extender_backup;
+  babl_set_extender (extender_backup);
 #endif
 }